package com.agent.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;

/*
    JWT令牌工具类
 */
public class JWTUtils {

    // 密钥
    private static final String SECRET = "persion-agent-secret-please-change-very-long-32-bytes-min";
    // 过期时间
    private static final long EXP_MS = (long) 24 * 60 * 60 * 1000; // 1 day

    private static Key key() {
        return Keys.hmacShaKeyFor(SECRET.getBytes(StandardCharsets.UTF_8));
    }

    // 创建令牌
    public static String create(Long userId, String subject) {
        long now = System.currentTimeMillis();
        return Jwts.builder()
                // 设置令牌的主题，如果传入的subject参数为null，则默认使用"user"作为主题
                .setSubject(subject == null ? "user" : subject)
                // 添加自定义声明，将用户ID以"uid"键存储在令牌中
                .claim("uid", userId)
                // 设置令牌签发时间，使用当前系统时间
                .setIssuedAt(new Date(now))
                // 设置令牌过期时间，基于当前时间加上1天
                .setExpiration(new Date(now + EXP_MS))
                // 使用HS256算法和密钥对令牌进行签名，密钥通过key()方法生成
                .signWith(key(), SignatureAlgorithm.HS256)
                // 将所有设置序列化为紧凑的JWT字符串格式并返回
                .compact();
    }

    // 解析令牌
    public static Jws<Claims> parse(String token) {
        return Jwts.parserBuilder().setSigningKey(key()).build().parseClaimsJws(token);
    }

    // 提取用户ID
    public static Long getUserId(String token) {
        try {
            return parse(token).getBody().get("uid", Long.class);
        } catch (JwtException e) {
            return null;
        }
    }

    public static boolean validate(String token) {
        try {
            parse(token);
            return true;
        } catch (JwtException e) {
            return false;
        }
    }
}
